查看原文
其他

把自己当成工具来解决问题

PJHubs freeCodeCamp 2022-05-05

5 月 30 日,在 freeCodeCamp 举办的直播活动《学习编程和编程教学,如何更高效更有趣》中,来自高校、公益组织、大型互联网企业、开源社区的五位嘉宾,通过分享自己的经历、经验,给大家处理编程学习和开发工作中的问题提供思路。


我们通过视频和文章把嘉宾们的精彩演讲分享给更多人,点击文末“阅读原文”可观看视频。


翁培钧

2019 年毕业于信息科大计算机学院软件工程,字节跳动 iOS 开发工程师,负责西瓜视频 & 今日头条 iOS 客户端。沉迷于 Apple 生态圈的开源爱好者,业余时间参与维护 Vary app(曾冲入App Store 效率榜前 20),拿到了 WWDC19 学生奖学金,给本科学习画上一个圆满的句号。同时也是一名公路自行车运动爱好者(正在筹备环中国骑游),目前在学习口琴,准备给自己做的游戏用口琴吹出配乐。


编程对我的意义


结缘

我与大部分同学一样,大学之前完全没有接触过编程,甚至连编程应该在什么软件下进行都不知道。但也就是这样,当我用自己前十八年积攒下的压岁钱买下人生中第一台 Mac 时,开机之前绕着看了半个多小时——之前从未见识过做工如此精细的笔记本。从那一刻开始,编程就给我打下了特殊的印记,对于我来说这是一件很神圣的事。

当时我还没入学,用 QQ 跟远在北京学校里的一位学长(同时他也是我的师傅)通过 QQ 语音的方式聊天。学长在电话里从头开始教我下载 Xcode,告诉我如何创建工程文件,哪个按钮是编译,哪个按钮是运行等等。经过了将近四个小时,我终于在这台 Mac 上敲出我的第一行代码:hello, world

这个过程给我的印象特别深,我把它叫作“304 事件”。同时这行 hello,world 也是我与编程的结缘。

触动最深的一次

编程,或者说学计算机这个专业给我触动最深的一次呢,是我参加了一个比赛。这个比赛的全称叫《首届中国 iOS 应用开发大赛》,虽然说是首届,但也仅仅只有这一届,后续这个比赛就被合并了。

当时我刚上大三,初生牛犊不怕虎嘛,觉得自己什么都能做,就给自己开了一个非常庞大的题目。这个项目的核心是做荧光笔的识别,如果用正常的思路去做,会牵扯到很多 ML 方面的东西,时间上根本来不及。所以我就用了非常原始的方法,花了一周的时间啃完了当时 3~4cm 厚的《OpenCV 3》开发指南,最后提交作品时我也没想到自己还真的能做出来,而且效果还不错,可用性很高。

后来比赛结果出来了,我非常惊喜地拿到了三等奖,奖品是一台 iPad Pro——我收获了人生中第一台 iPad。这个作品当时开源的时候,还冲上了当天 GitHub 的 treading repo 第一,让我着实开心了好久。


我是如何学习编程的


说到「我是如何学习编程」的这个话题,我觉得主要是看自己对自己的定位是怎么样的。如果我们的定位就是本科毕业即工作,很多事情就很好办了,目标就是工作,一些犄角旮旯的事情完全不用 care,比如上课点名时,如何发挥出室友的能动性,把一些时间匀出来,让自己更加专注。


GitHub contributions

算法


我接触 GitHub 的时间也不早,是在大一的一次社团活动上,学长一步一步地带领我们从注册账号到 push 第一次代码全流程。从此我就打开了一个新世界,开始关注各路豪杰,曾经有一段时间我觉得刷 GitHub 看大家的动态就跟刷微博朋友圈一样,时不时就要刷一刷看看大家都在关注什么新奇好玩的技术,能不能用在自己做的东西上。


后来我有从一些渠道了解到有一些大佬开始玩类似「每日打卡」的活动,就是选定几个主题,在接下来一年的时间里每天都提交代码,而且是要有意义代码,不能说因为今天没来得及 commit 就胡乱敲几个回车或者空格敷衍任务。当然了,这个活动纯粹靠自觉,毕竟这种活动不但可以养成自己每天都能写点代码的好习惯,还能逼迫自己保持对新技术的热情。


但是一开始的我并没有很多经验,也不知道选择什么样的主题适合自己,所以也是跟大部分参与活动的前辈们一样,每天至少一道算法题。我坚持了差不多一个月就放弃了,因为真的太无聊了,每天解决一两道算法题并没有给我带来在计算机方面实质性的提升,刷题之前的我和刷题之后的我都是一样的菜——我并没有解决任何实质性的问题,因为算法题大部分都是过于抽象的,刷题只是在解决一些特定场景下相对虚的问题。



freeCodeCamp


在接下来的时间里呢,我也没有很好的办法。前面也已经说过,我与大部分同学一样,大学之前从未接触过编程,在计算机上没有自己的学习思路和方法,所以我采取的办法是加入学校最强技术社团,学长学姐带我上道。


其次就是在网上大量浏览一些技术社区,看当下大家都在讨论什么新奇的技术,久而久之,耳濡目染,自己也能明白整个技术圈里的一些黑话,一些好玩的学习方法,也是在这个时候我知道了 freeCodeCamp 这个社区。


当我得知这个社区和它倡导的学习方式时,我立马就疯狂安利给身边的同学朋友,尤其是我的女朋友。当时她是准备走前端工程师的道路,但因为一些个人原因,现在做了设计师。


当时她在 freeCodeCamp 上刷了将近一个暑假,她给我的反馈是,如果学校一开始就用这种“一步步所见即所得”的方式来引导我们学习,那她应该不会那么厌烦这个专业。


这个时候我发现我好像可以做出一些东西来了,但是都太像玩具了,因为这个时候做出来的东西都是在「最优解」的前提下做出来的, 跟实际问题还是有很大的一段差距。


App


后来我慢慢地参与更多的社团活动,接触到了更多的人和事,并且也是在这个时候决定了我就要走 iOS 开发的路线。刚好当时有另外一个小伙伴得知我正在做 iOS 开发,他就和我筹划了一个产品去刷比赛,当时是大一暑假军训完,距离开学还有一个多月的时间。


这一个多月里我写了当时我所能承受的最大代码量:三千多行代码。自己熬了几个星期,最后总算做完了。现在回过头去看当时自己写的代码,有些地方的实现还是挺精妙的,因为当时自己并没有用上正规的软件开发套路,导致很多 feature 的实现都是按照自己的经验来的,就有了一些现在看回去稍微还是有一点点眼前一亮的地方。


其实这也说明了,啥都不懂的时候,其实往往能突破一点常规限制哈哈哈。正是因为自己第一个做出来的产品,给了我极大的自信心,同时也收获了很多很多奖励,包括也是通过这个 App 在大二下学期刚开学就找到了第一份实习工作。


虽然我去的是一家名不见经传的外包公司,但是我没想到自己能够这么快就接触社会,接触商业化的软件开发流程,这对我后面的发展有非常大的帮助。


开源


有时候从别人手里获取的东西多了,自己就老想着能回报点什么,所以也慢慢开始了做一些同时也参与一些开源项目。到目前为止,我总共在 GitHub 拿到了 1132 个 star,远超预期。


在做一些开源项目的同时,我也在尝试性地输出一些东西,慢慢的就结识了技术圈里的各位大佬,不管是人脉还是交际圈都得到了质量上的提升,这点对我后续的不管是职业发展还是个人成长都有很大的帮助。


最近我主要是专注在使用 Swift 语言深入到 Apple 自家的生态圈中去,串联各个硬件平台,做一些新奇好玩的小游戏,这算是我个人近期比较大的一个 side project。同样是以完全开源的方式去做的,会出文章和视频教程,目前已经完成了三个小游戏。


总的来说,不管是参与还是发起一个开源项目,首先「开源」本身是一个非常好的主题,这个主题可以承载我们个人相当多的发挥。换句话说,我们可以在开源这个平台上玩出很多自己的花样,不用受以往的限制,纯粹是凭自己的兴趣爱好去驱使。



MVP 最小化可行性产品


从上文的内容来看,我在编程这一层面上总结出了一套自己的学习方法和流程,核心是 MVP,也就是「最小化可行性产品」。把自己当作工具,把自己当作一把「瑞士军刀」,遇到问题不可怕,透过问题的本质来转化出自己可以得到成长的地方才是可取的。


实话实说,在本科的学习生活里,我非常不喜欢上课。不是不喜欢学习,而是不喜欢「上课」的这种模式。我不是很懂为什么都到大学了,还要从早到晚五六十人坐在一间屋子里,听着老师滔滔不绝地讲课,这跟我上大学之前对大学的设想是完全不一致的。


所以我大一一结束,就把自己和课堂脱离开来,一切以学习到东西为底线去展开。我更加喜欢通过做某一个东西来反映出自己欠缺哪方面的知识,从而刺激自己去学习这一方面的内容。我认为这才是对症下药,而且下的还是猛药。如果在这一过程有琢磨不透的地方,我认为这个时候老师或者学长学姐的作用就体现出来了,也就是所谓的“指路人”的作用也就出来了。



PFollow 是我和女朋友出去旅行了一趟,发现当时并没有一个比较好的 App 去记录自己去过的地方,旅行结束回学校后,我就用了半个月的时间从设计到开发,再到最后的发布,做的一个符合当时自己的品味的产品。后来我看到了一些资料,了解到 Instagram 前身就是做地点签到的,然后仔细想了一些,这个赛道太窄了,就算这个产品最后持续运营下去我认为也是自嗨,就直接开源了。


Peek 就是上文所说的,让我触动最深的一次。在一次离散数学课上,真的太无聊了,我就又开始刷知乎,然后突然看到日本一个产品的宣传视频,核心就是荧光笔识别。我看完宣传视频后,整个人都嗨起来了,因为我在高中的时候就是「荧光笔标注」的资深用户。


前前后后从放弃到重新拿起来,这个项目我做了大半年的时间。如果不是当时有比赛催着我,我还真的不一定能够逼自己把成品做出来。


Vary 也是我在课上刷知乎刷到的,具体是上什么课记不得了。当时是 Vary 的开发者 Dandy 在知乎上发了一篇文章,说了他为什么要做 Vary,然后我就顺着了解到了 Dandy 这个人。我发现他真的好厉害,他的博客非常非常漂亮,而且只上过十几天的小学,从此就变成了一个自学者,摄影技术非常之强,总之就是一个很棒很棒的人!也就是从这个时候开始,我成为了 Vary 的忠实用户。


后来呢我就一直在给 Dandy 报 Vary 的 bug,bug 报多了他烦我也烦哈哈哈。Dandy 就说,那干脆你加入 Vary 的开发吧,我们一起来完善它!我当时非常高兴,我记得非常清楚是 2019 年 8 月 16 日的那天晚上,这是我第一次因为热爱而被接纳。一直到现在我都是 Vary iOS 客户端的核心开发成员,这种给自己非常喜欢的产品写代码,感觉真的很棒很棒!


星球罐子是我和两个小伙伴做的一个小游戏,也是这个小游戏为我打开了游戏开发的大门。我是从被游戏伤害,到厌恶游戏,再到现如今热爱游戏,这种转变很大一部分是我对「游戏」本身的认识有了很大的转变。以前我只认为游戏就是大人口中的“害人精”,但直到我真真正正进入游戏开发这个领域,我才知道,原来「定义一个属于自己的世界」,做自己上帝的感觉是多么的有趣。



在去年夏天,我再次通过 MVP 的方式拿到了 WWDC19 学生奖学金。这个奖学金对我而言意义巨大,首先是我可以非常有底气地对自己说,之前给自己的定位和指导都是可行的;其次是作为一个 iOS 开发者,我终于踏上了朝圣之旅,一睹 Apple Park!


Apple 的 WWDC 奖学金申请我认为非常友好,允许我们有天马行空的想法,对作品的主题不做任何要求,但必须使用 Swift 语言和 Swift Playgrouns 完成。我的作品是关于「黎族织锦」的故事,通过拼图游戏的方式去讲述。我写了几篇比较详细的文章描述 WWDC 奖学金,从申请流程、作品细节甚至是签证过程都有说到,因为时间关系就不在此展开,欢迎大家到我的博客(http://pjhubs.com/)继续阅读。


水到渠成


同时呢,也是因为拿到了 WWDC 奖学金的原因吧,再加上其他一些因素,受 Apple Store 北京西单店的邀请,我和 Kevin 一同给来自北京燕京小天鹅公益学校的小朋友做了分享,与小朋友们度过了一个非常有趣的六一儿童节。



MVP 最小化可行性产品的核心思想,我自己的理解是这样的:做某一个产品或者项目,花 80% 的时间解决最核心的 20% 的问题,然后花 20% 的时间去解决或者不解决其余 80% 的问题。因为这剩下 80% 的问题,其中的 80% 是我们之前已经解决过或者有思路的,没必要花费重复的时间去解决重复的问题。


重复的问题和思考的总结,可以通过博客文章进行记录。写文章是一件对自己过往经历经验总结十分到位的方式,是自己和自己对话。我个人不是很喜欢戴着面具写博客,本来我们在日常生活与人交往过程中,就在不停地给自己戴上不同的面具,如果在自己的博客——这片自己在互联网上的自留地——还戴上面具,我觉得这也太说不过去了。


所以呢,结合 MVP 的思想和写博客——我把它们比作“剑”和“盾”——可以较好地把我们的能力以一个滚雪球的方式不停地向前滚,越滚越大。一旦养成这两个习惯,并且形成了一套自己的思维方式,你会发现自己看待很多问题都不一样了,自己也就成为了一个能够真正解决问题的工具。



之前我也是挺不相信博客能够带给一个人多少改变,但经过自己的尝试后发现,其实当我们真正地在去做一件自己认为有价值、有意义的事情时,是一定会或多或少的对身边的人对自己产生影响的。


总结


好啦~我这里简单的和大家分享了一些我在编程和在计算机方面的学习方法。其实我觉得编程和计算机并不复杂,它们的魅力也就在于:在一个个看上去十分复杂,毫无头绪的问题面前,我们可以发挥自己的主观能动性,根据自己的想法和创意去设计出一套套的解决方案,这种「来者不拒」的感觉还颇有一番侠客之味呢!


非营利组织 freeCodeCamp.org 自 2014 年成立以来,以“帮助人们免费学习编程”为使命,创建了大量免费的编程教程,包括交互式课程、视频课程、文章等。线下开发者社区遍布 160 多个国家、2000 多个城市。我们正在帮助全球数百万人学习编程,希望让世界上每个人都有机会获得免费的优质的编程教育资源,成为开发者或者运用编程去解决问题。


你也想成为

freeCodeCamp 社区的贡献者吗

欢迎点击以下文章了解


✨✨

招募丨freeCodeCamp 翻译计划
成为 freeCodeCamp 专栏作者,与世界各地的开发者分享技术知识



点击“阅读原文”观看视频

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存